JVM垃圾收集器

您所在的位置:网站首页 parallel scavenge收集器 JVM垃圾收集器

JVM垃圾收集器

2024-07-10 14:05| 来源: 网络整理| 查看: 265

问题

带着问题去学习,效率更高!

垃圾收集器和垃圾回收算法的关系?分别请你谈谈?

怎么查看服务器的垃圾收集器是哪个?如何配置垃圾收集器?谈谈你对垃圾收集器的理解?

你知道G1垃圾收集器吗?

垃圾收集算法

垃圾收集器和垃圾回收算法的关系? 垃圾算法(引用计数,复制算法,标记清除,标记整理)都是内存回收的方法论,垃圾收集器是这种算法的落地实现。

请移步JVM中的GC收集算法有哪些

先了解相关概念 垃圾收集器主要发生的区域

主要发生在方法区和堆中,其中方法区在jdk1.8中的实现是元空间(Metaspace)

次收集器

发生在新生代中的GC,被称为Young GC(Scavenge GC,Minor GC), 新生代中的对象大多数生命周期比较短,所以这里的GC发生很频繁。

全收集器

Full GC,指发生在老年代的 GC,出现了 Full GC 一般会伴随着至少一次的 Young GC(老 年代的对象大部分是Young GC 过程中从新生代进入老年代),比如:分配担保失败。Full GC 的速度一般会比 Young GC 慢 10 倍以上。

什么时候触发GC 当 Eden 空间不足以为对象分配内存时,会触发 Young GC。 当老年代内存不足,或者显式调用 System.gc() 会触发Full GC(也会伴随着执行至少一次的Young GC)。 STW(Stop-the-world)和并发

GC在运行的时候,暂停整个应用就叫STW。 并发这里只的是GC线程和用户线程一起运行,GC可能占用用户的线程。

串行和并行

串行:垃圾回收的时候只有一个GC线程工作。 并行:垃圾回收的时候有多个GC线程一起工作。 在单核的情况下,并行可能更慢。

四种主要的垃圾收集器 串行收集器 适用于单线程系统,适用一个线程进行垃圾回收,会暂停所有的用户线程,不适合服务器环境。 并行收集器 多个垃圾收集器并行工作,此时用户线程是暂停的,适用于计算/大数据处理, 适用于弱交互的场景,强调吞吐量。 CMS收集器(Concurrent Mark Sweep的简写 并发标记,清除 ) 用户线程和垃圾收集线程同时执行(不一定并行,可能交替执行)不需要暂停用户线程,互联网公司多数使用它, 适用于强交互,对响应时间有要求的场景。 G1收集器 将堆内存分割成不同的区域,并行的进行垃圾收集。

后台日志中的部分参数解释 DefNew 相当于 Default New Generation的缩写 默认的年轻代使用的垃圾回收器是什么 Tenured 相当于 old ParNew 相当于 Parallel New Generation 年轻代使用的是并行回收 PSYoungGen 其中ps相当于Parallel Scavenge ParOldGen 相当于Parallel Old Generation 老年底并行垃圾收集器 垃圾收集的组合

年轻代收集器(复制算法) 年轻代串行收集器(serial [ˈsɪəriəl] 或serial copying) 特征

单线程收集 收集时必须Stop The Word(停止所有的用户线程) jvm内存不大时停顿时间短(说明堆内存大小影响GC的效率)

对应JVM参数: -XX:UseSerialGC

配置jvm的时候只需要配置年轻代的收集器即可,jvm会自动选择匹配的老年代收集器。 开启后会使用:年轻代使用Serial +老年代使用的是Serial Old 的收集器组合,说明都是使用的串行。 使用的算法为:年轻代使用复制算法,老年代使用标记-整理算法;

图例:

年轻代并行收集器(ParNew) 特征

多线程收集(是Serial的多线程版本) 单cpu的效率不及串行收集器Serial,多cpu肯定快于Serial 收集的过程中还是会暂停其他的用户线程。 可以控制ParNew的运行线程数,默认情况下线程数量和CPU核数的数目相同。

常用对应的JVM参数:-XX:UseParNewGC

启用ParNew收集器只会影响年轻代的手机,不影响老年代。 开启后会使用:年轻代使用ParNew收集器, 老年代使用Serial Old 收集器, 注意:jdk8已经不推荐这么组合了!因为Serial Old要被弃用了。 使用的算法为:年轻代使用复制算法,老年代使用标记-整理算法; -XX:UseParallelGCThreads这个参数可以设置并行收集的线程数。(CPU>8 设置N=5/8 CPU 1) { jio_fprintf(defaultStream::error_stream(), "Conflicting collector combinations in option list; " "please refer to the release notes for the combinations " "allowed\n"); status = false; } return status; 查看正在运行的JVM垃圾收集器?

使用jps查出进程,使用jinfo打印运行的jvm参数 jinfo -flags PID

可以使用Jconsole,jvisualvm可视化工具进行查看

在项目启动的时候添加JVM参数:-XX:+PrintCommandLineFlags 也可以获得。

生产上怎么选择收集器?

选择收集器应该考虑到服务器硬件的配置,以及应用程序的特点;

单CPU或者内存小的服务器,选择串行收集器 -XX:+UseSerial 多CPU,需要打的吞吐量的,选择并行收集器,如:后台计算较多的应用, -XX:+UseParallelGC 或者 -XX:+UseParallelOldGC 多cpu,追求停顿时间短的,选择并发收集器,如:需要快速响应的互联网应用 -XX:+UseConcMarkSweepGC jvm运行时数据区

这个图和上面的jvm总体结构图没有冲突,这里只是强调一个线程在运行方法的时候涉及到的内存。

逃逸分析

决定这个变量或者对象实例是在栈中分配还是堆中分配,逃逸指的是这个变量或者对象实例的作用域是否超过当前方法(逃出了方法)。 如果一个对象实例仅仅在当前方法中使用,并没有通过【返回值返回出去】或者 【通过调用别的方法时作为参数传递过去】 那么这个对象就是没有发生逃逸,可以将这个对象分配在java栈空间中,栈空间是随着方法的执行结束而清理的,不需要GC,所以可以提高效率。

jvm中逃逸分析是可以设置开关的,默认是开启的。

其他概念 对象的创建过程的内存分配

https://www.cnblogs.com/wangsen/p/11243049.html

对象的引用(强,软,弱,虚)

https://www.cnblogs.com/wangsen/p/11206956.html https://www.cnblogs.com/rgever/p/8902210.html



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3